package com.nathan.crm.service;

import com.nathan.base.BaseService;
import com.nathan.crm.dao.CustomerLossMapper;
import com.nathan.crm.dao.CustomerMapper;
import com.nathan.crm.dao.CustomerOrderMapper;
import com.nathan.crm.utils.AssertUtil;
import com.nathan.crm.utils.PhoneUtil;
import com.nathan.crm.vo.Customer;
import com.nathan.crm.vo.CustomerLoss;
import com.nathan.crm.vo.CustomerOrder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CustomerService extends BaseService<Customer,Integer> {

    @Resource
    private CustomerMapper customerMapper;
    @Resource
    private CustomerOrderMapper customerOrderMapper;
    @Resource
    private CustomerLossMapper customerLossMapper;

    /**
     * 添加客户
     *  1、参数校验
     *      客户名称name    非空，名称唯一
     *      客户级别level   非空
     *      法人代表fr    非空
     *      手机号码    非空，格式正确
     *  2、设置参数的默认值
     *      是否有效isValid     1
     *      创建时间createDate  系统当前时间
     *      修改时间updateDate  系统当前时间
     *      客户编号khno        系统生成,唯一(uuid|时间戳|年月日时分秒|雪花算法)格式:KH+时间戳
     *  3、执行添加操作，判断受影响的行数
     * @param customer
     */
    @Transactional
    public void addCustomer(Customer customer) {
        /* 1、参数校验 */
        checkCustomerParams(customer.getName(),customer.getLevel(),customer.getFr(),customer.getPhone());
        // 判断客户名惟一
        Customer cus = customerMapper.selectByName(customer.getName());
        AssertUtil.isTrue(null != cus,"客户已存在！");

        /* 2、设置默认值 */
        customer.setCreateDate(new Date());
        customer.setUpdateDate(new Date());
        String khno = "KH" + System.currentTimeMillis();
        customer.setKhno(khno);

        /* 3、执行添加操作 */
        AssertUtil.isTrue(customerMapper.insertSelective(customer) < 1,"客户添加失败!");
    }

    /**
     *  参数校验
     * @param name
     * @param level
     * @param fr
     * @param phone
     */
    private void checkCustomerParams(String name, String level, String fr, String phone) {
        // 客户名称name    非空
        AssertUtil.isTrue(StringUtils.isBlank(name),"客户名称不能为空！");
        // 客户级别level   非空
        AssertUtil.isTrue(StringUtils.isBlank(level),"请选择客户级别！");
        // 法人代表fr    非空
        AssertUtil.isTrue(StringUtils.isBlank(fr),"法人代表不能为空！");
        // 手机号码    非空，格式正确
        AssertUtil.isTrue(!PhoneUtil.isMobile(phone),"手机号格式错误！");
    }

    /**
     * 修改客户信息
     * @param customer
     */
    @Transactional
    public void updateCustomer(Customer customer) {
        /* 1、参数校验 */
        checkCustomerParams(customer.getName(),customer.getLevel(),customer.getFr(),customer.getPhone());
        // 判断客户名惟一
        Customer cus = customerMapper.selectByName(customer.getName());
        AssertUtil.isTrue(cus != null && cus.getId() != customer.getId(),"客户名已存在，修改失败！");

        /* 2、执行更新操作 */
        AssertUtil.isTrue(customerMapper.updateByPrimaryKeySelective(customer) != 1,"更新客户信息失败！");
    }

    /**
     * 删除客户
     * @param id
     * @return
     */
    @Transactional
    public void deleteCustomer(Integer id) {
        // 根据id查询对应的客户信息
        Customer customer = customerMapper.selectByPrimaryKey(id);

        customer.setIsValid(0);

        customerMapper.updateByPrimaryKeySelective(customer);
    }

    /**
     * 更新客户流失状态
     *  state   0=正常客户  1=流失客户
     *
     *  1、查询流失的客户数据
     *  2、将流失客户数据批量添加到客户流失表中
     *  3、批量更新客户流失状态    state=1
     */
    @Transactional
    public void updateCustomerState(){
        /* 1、查询流失的客户数据 */
        List<Customer> lossCustomerList = customerMapper.queryLossCustomer();

        /* 2、将流失客户数据批量添加到客户流失表中 */
        if (lossCustomerList != null && lossCustomerList.size() > 0){
            // 定义集合，存储流失客户的id
            List<Integer> lossCusIds = new ArrayList<>();
            // 定义集合，存储流失客户的信息
            List<CustomerLoss> customerLossList = new ArrayList<>();

            // 遍历查询到的所有流失客户
            lossCustomerList.forEach(customer -> {
                // 将流失客户id存入到集合中
                lossCusIds.add(customer.getId());

                CustomerLoss customerLoss = new CustomerLoss();
                // 设置流失客户编号
                customerLoss.setCusNo(customer.getKhno());
                // 设置流失客户名字
                customerLoss.setCusName(customer.getName());
                // 设置流失客户经理
                customerLoss.setCusManager(customer.getCusManager());
                /*
                    设置流失客户最后下单时间
                 */
                // 通过流失客户id查询最后下单记录
                CustomerOrder customerOrder = customerOrderMapper.queryLastOrderByCusId(customer.getId());
                // 判断订单是否存在，存在就设置最后下单时间
                if (customerOrder != null)
                    customerLoss.setLastOrderTime(customerOrder.getOrderDate());

                // 设置流失客户状态state  0=暂缓流失（可以挽回）  1=确定流失（不能挽回）
                customerLoss.setState(0);

                // 将CustomerLoss添加到CustomerLossList集合中
                customerLossList.add(customerLoss);
           });

            // 批量添加CustomerLoss
            AssertUtil.isTrue(customerLossMapper.insertBatch(customerLossList) != customerLossList.size(),"批量添加流失客户失败！");
            /* 3、批量更新客户流失状态 */
            AssertUtil.isTrue(customerMapper.updateCustomerState(lossCusIds) != lossCusIds.size(),"批量更新客户流失状态失败！");
        }

    }
}
